// 导入 axios 及相关类型定义，注意这里使用的是 OpenHarmony 平台的 axios 适配版本
import axios, { AxiosError, AxiosResponse, InternalAxiosRequestConfig } from '@ohos/axios';

// 创建 axios 实例，方便统一配置请求相关的公共信息
const request = axios.create({
  // baseURL: '192.168.0.101:6060', // 通过 ipconfig 查询当前电脑的 ip，使用自己电脑的 ip 地址
  // baseURL: '192.168.0.103:6060', // 通过 ipconfig 查询当前电脑的 ip，使用自己电脑的 ip 地址
  // baseURL: 'http://192.168.153.159:6060/',
  baseURL: 'http://10.217.6.104:6060/',

  timeout: 20000, // 设置请求超时时间（单位：毫秒），超过时间会自动中断请求
})

// 请求拦截器：在真正发出请求之前，会先进入这里
request.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    // 未来需要添加 token
    // config.headers.token = token;
    // 👆 在这里可以统一给每个请求加上 token、时间戳、语言标识等公共请求头
    // 例如：config.headers['Authorization'] = `Bearer ${token}`;
    const token = AppStorage.get('token') as string;
    if (token) {
      config.headers.token = token;
    }
    return config; // 必须返回 config，否则请求不会继续执行
  }
)

// 响应拦截器：后端返回数据后，先经过这里，再交给调用的地方Discover
request.interceptors.response.use(
  (response: AxiosResponse) => {
    // 假设后端接口统一返回格式为 { code:200, data:xxx, message:"ok" }
    if (response.data.code === 200) {
      // code === 200 表示成功，直接返回后端的 data 部分
      return response.data.data;
    } else {
      // 其他 code 表示失败，抛出错误信息
      // Promise.reject 会让调用的地方进入 catch
      return Promise.reject(response.data.message);
    }
  },
  (error: AxiosError) => {
    // 如果请求本身失败（比如：断网、超时、500 等），会进入这里
    // 可以统一处理错误信息，比如弹窗提示“网络错误，请稍后重试”
    return Promise.reject(error.message);
  }
)

// 定义一个 Http 工具类，对 axios 的常用请求方法进行二次封装
// 好处：调用时更简洁，而且可以统一加上类型 <T> 来限制返回数据类型
export default class Http {
  // GET 请求：常用于获取数据，例如查询列表、搜索内容
  get<T>(url: string, params?: Object) {
    return request.get<null, T>(url, {
      params // GET 请求的参数会拼接在 URL 后面
    })
  }

  // POST 请求：常用于提交数据，例如登录、注册、表单提交
  post<T>(url: string, data?: Object) {
    return request.post<null, T>(url, data)
  }

  // PUT 请求：常用于修改数据，例如修改用户信息、更新状态
  put<T>(url: string, data?: Object) {
    return request.put<null, T>(url, data)
  }

  // DELETE 请求：常用于删除数据，例如删除一条记录
  delete<T>(url: string, params?: Object) {
    return request.delete<null, T>(url, {
      params // DELETE 请求的参数（比如要删除的 id）会拼接在 URL 后面
    })
  }
};
